package zero.tech.games.mj.data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import zero.tech.games.logic.common.GameBase;
import zero.tech.games.logic.common.Room;
import zero.tech.games.mj.data.entity.MJPlaybackDetail;
import zero.tech.games.mj.data.entity.PlayerData;
import zero.tech.wsnet.controller.LogicController;

/**
 * 房间数据
 * @author ludry
 *
 */
public class MjGameBase extends GameBase{
	/** 房间 */
	private Room room;
	/** 游戏配置 */
	private MjConfig mjConfig;
	/** 房间玩家列表 */
	private Map<Integer, PlayerData> playerMap = new HashMap<Integer, PlayerData>();
	/** 当前操作玩家 */
	private PlayerData operData;
	/** 当前操作的牌 */
	private int currCard = 0;
	/** 当前出牌的玩家ID */
	private int currOutId = 0;
	/** 记录赢的玩家的位置和信息(一炮多响处理胡牌后下个玩家打牌的问题) */
	private String huSStr = "";
	/** 过庄胡信息(key 玩家id, value 是否可以胡牌) */
	private HashMap<Integer, Boolean> pass = new HashMap<Integer, Boolean>();
	/** 当前胡牌的玩家 */
	private List<Integer> huArr = new ArrayList<Integer>();
	/** 当次胡牌的人数 */
	private int huCount = 0;
	/** 当局庄家id */
	private int huid = 0;
	/** 牌库 */
	private List<Integer> cardBank = new ArrayList<Integer>();
	/** 当局鬼牌 */
	private List<Integer> guiCards = new ArrayList<Integer>();
	/** 上一个玩家是否有点杠操作 */
	private int dGangUid;
	/** 上一个玩家是否有点杠操作类型 */
	private int dGangType = 0;
	/** 是否可摸牌 */
	private boolean isGetCard = true;
	/** 用于一炮多响 */
	private String gangLast = "";
	/** 用于一炮多响已经赢了的玩家id */
	private List<Integer> huList = new ArrayList<Integer>();
	/** 记录当局可以胡的玩家，不会改bain */
	private List<Integer> canHu = new ArrayList<Integer>();
	/** 记录上轮玩家是不是抢杠 */
	private boolean isQiangGang = false;
	/** 当局胡的牌 */
	private int hupai = -1;
	/**当局码牌得分(中码次数)*/
	private int theCode = 0;
	/**当局码牌*/
	private List<Integer> maPai = new ArrayList<Integer>();
	/**是否在抢杠状态*/
	private boolean grabBar = false;
	/** 战绩回放数据 */
	private MJPlaybackDetail playbackDetail = new MJPlaybackDetail();
	
	
	/**
	 * 初始化房间数据
	 * @param room
	 */
	public MjGameBase(Room room) {
		super(room.getRoom_id());
		for (LogicController controller : room.getAllControllers().values()) {
			PlayerData player = new PlayerData(controller.getId(), controller.getSimpleUser().getNick());
			this.playerMap.put(controller.getId(), player);
		}
	}
	
	/**
	 * 添加操作的牌
	 * @param card
	 * @param uid
	 * @throws Exception
	 */
	public void updateCurrCtrl(int card, int uid){
		System.err.println("当前操作玩家id:" + uid);
		setOperData(uid);
		setCurrCard(card);
	}
	
	/**
	 * 房间
	 * @return
	 */
	public Room getRoom() {
		return room;
	}

	/**
	 * 房间
	 * @param room
	 */
	public void setRoom(Room room) {
		this.room = room;
	}

	/**
	 * 游戏配置
	 * @return
	 */
	public MjConfig getMjConfig() {
		return mjConfig;
	}

	/**
	 * 游戏配置
	 * @param mjConfig
	 */
	public void setMjConfig(MjConfig mjConfig) {
		this.mjConfig = mjConfig;
	}

	/**
	 * 根据uid获取房间玩家
	 * @return
	 */
	public PlayerData getPlayerUid(int uid) {
		return this.playerMap.get(uid);
	}
	
	/**
	 * 房间玩家列表
	 * @return
	 */
	public Map<Integer, PlayerData> getPlayerMap() {
		return playerMap;
	}

	/**
	 * 房间玩家列表
	 * @param playerMap
	 */
	public void setPlayerMap(Map<Integer, PlayerData> playerMap) {
		this.playerMap = playerMap;
	}
	
	/**
	 * 当前操作玩家
	 * @return
	 */
	public PlayerData getOperData() {
		return operData;
	}

	/**
	 * 当前操作玩家
	 * @param operData
	 */
	public void setOperData(PlayerData operData) {
		this.operData = operData;
	}
	
	/**
	 * 根据玩家id设置当前操作玩家
	 * @param operData
	 */
	public void setOperData(int uid) {
		PlayerData playerData = this.playerMap.get(uid);
		this.operData = playerData;
	}

	/**
	 * @return 当前操作的牌(打到堂子的牌)
	 */
	public int getCurrCard() {
		return currCard;
	}

	/**
	 * @param currCard
	 *            当前操作的牌
	 */
	public void setCurrCard(int currCard) {
		this.currCard = currCard;
	}

	/**
	 * 当前出牌的玩家ID
	 * @return
	 */
	public int getCurrOutId() {
		return currOutId;
	}

	/**
	 * 当前出牌的玩家ID
	 * @param currOutId
	 */
	public void setCurrOutId(int currOutId) {
		this.currOutId = currOutId;
	}

	/** 一炮多响处理胡牌后下个玩家打牌的问题 */
	public String getHuSStr() {
		return huSStr;
	}

	/** 一炮多响处理胡牌后下个玩家打牌的问题 */
	public void setHuSStr(String huSStr) {
		this.huSStr = huSStr;
	}

	/**
	 * 过庄胡信息(key 玩家id, value 是否可以胡牌)
	 * @return
	 */
	public HashMap<Integer, Boolean> getPass() {
		return pass;
	}

	/**
	 * 过庄胡信息(key 玩家id, value 是否可以胡牌)
	 * @param pass
	 */
	public void setPass(HashMap<Integer, Boolean> pass) {
		this.pass = pass;
	}
	
	/**
	 * 过庄胡信息(key 玩家id, value 是否可以胡牌)
	 * @param chair 玩家id
	 * @param isHu 是否可以胡
	 */
	public void setPassInfo(int uid, boolean isHu) {
		getPass().put(uid, isHu);
	}
	
	/**
	 * 删除胡牌数组信息
	 * 
	 * @param uid
	 */
	public void removeHuArrByUid(int uid) {
		for (int i = 0; i < getHuArr().size(); i++) {
			if (uid == getHuArr().get(i)) {
				getHuArr().remove(i);
				break;
			}
		}

	}

	/**
	 * 添加胡牌的信息
	 * 
	 * @param uid
	 */
	public void addHuUid(int uid) {
		boolean isTrue = true;
		for (int i = 0; i < getHuArr().size(); i++) {
			if (uid == getHuArr().get(i)) {
				isTrue = false;
				break;
			}
		}
		if (isTrue) {
			getHuArr().add(uid);
		}
	}

	/**
	 * @return 当前胡牌的玩家
	 */
	public List<Integer> getHuArr() {
		return huArr;
	}
	
	/**
	 * 清理胡牌数据
	 */
	public void clearHuInfo() {
		this.huCount = 0;
		getHuArr().clear();
	}

	/**
	 * 清理该玩家的胡牌数据
	 * @param chair
	 */
	public void clearHuInfo(int uid) {
		setHuCount(getHuCount() - 1);
		for (int i = 0; i < getHuArr().size(); i++) {
			if (getHuArr().get(i) == uid) {
				getHuArr().remove(i);
				break;
			}
		}
	}
	
	/**
	 * @return 当次胡牌的人数
	 */
	public int getHuCount() {
		return huCount;
	}
	
	/**
	 * @param huCount 当次胡牌的人数
	 */
	public void setHuCount(int huCount) {
		this.huCount = huCount;
	}

	/**
	 * 当次胡牌的人数 
	 * @param huCount
	 */
	public void addHuCount(int huCount) {
		this.huCount = getHuCount() + huCount;
	}

	/**
	 * 当局庄家id
	 * @return
	 */
	public int getHuid() {
		return huid;
	}

	/**
	 * 当局庄家id
	 * @param huid
	 */
	public void setHuid(int huid) {
		this.huid = huid;
	}

	/**
	 * 牌库
	 * @return
	 */
	public List<Integer> getCardBank() {
		return cardBank;
	}

	/**
	 * 牌库
	 * @param cardBank
	 */
	public void setCardBank(List<Integer> cardBank) {
		this.cardBank = cardBank;
	}
	
	/**
	 * 当局鬼牌
	 * @return
	 */
	public List<Integer> getGuiCards() {
		return guiCards;
	}

	/**
	 * 当局鬼牌
	 * @param guiCards
	 */
	public void setGuiCards(List<Integer> guiCards) {
		this.guiCards = guiCards;
	}

	/**
	 * 设置杠的信息
	 * @param uid 玩家ID
	 * @param type 类型
	 */
	public void setGangInfo(int uid, int type) {
		setdGangUid(uid);
		setdGangType(type);
	}
	
	/**
	 * @return 上一个玩家是否有点杠操作
	 */
	public int getdGangUid() {
		return dGangUid;
	}

	/**
	 * @param dGangUid
	 *            上一个玩家是否有点杠操作
	 */
	public void setdGangUid(int dGangUid) {
		this.dGangUid = dGangUid;
	}
	
	
	/**
	 * 上一个玩家是否有点杠操作类型
	 * @return
	 */
	public int getdGangType() {
		return dGangType;
	}

	/**
	 * 上一个玩家是否有点杠操作类型
	 * @param dGangType
	 */
	public void setdGangType(int dGangType) {
		this.dGangType = dGangType;
	}
	
	/**
	 * @return 是否可摸牌
	 */
	public boolean isGetCard() {
		return isGetCard;
	}

	/**
	 * @param isGetCard 是否可摸牌
	 */
	public void setGetCard(boolean isGetCard) {
		this.isGetCard = isGetCard;
	}
	
	/**
	 * 用于一炮多响
	 * @return
	 */
	public String getGangLast() {
		return gangLast;
	}

	/**
	 * 用于一炮多响
	 * @param gangLast
	 */
	public void setGangLast(String gangLast) {
		this.gangLast = gangLast;
	}
	
	/**
	 * 用于一炮多响已经赢了的玩家
	 * @return
	 */
	public List<Integer> getHuList() {
		return huList;
	}

	/**
	 * 用于一炮多响已经赢了的玩家
	 * @param huList
	 */
	public void setHuList(List<Integer> huList) {
		this.huList = huList;
	}
	
	/**
	 * 记录当局可以胡的玩家
	 * @return
	 */
	public List<Integer> getCanHu() {
		return canHu;
	}

	/**
	 * 记录当局可以胡的玩家
	 * @param canHu
	 */
	public void setCanHu(List<Integer> canHu) {
		this.canHu = canHu;
	}
	
	/**
	 * 记录上轮玩家是不是抢杠
	 * @return
	 */
	public boolean isQiangGang() {
		return isQiangGang;
	}

	/**
	 * 记录上轮玩家是不是抢杠
	 * @param isQiangGang
	 */
	public void setQiangGang(boolean isQiangGang) {
		this.isQiangGang = isQiangGang;
	}
	
	/**
	 * 当局胡的牌
	 * @return
	 */
	public int getHupai() {
		return hupai;
	}

	/**
	 * 当局胡的牌
	 * @param hupai
	 */
	public void setHupai(int hupai) {
		this.hupai = hupai;
	}
	
	/**
	 * 当局码牌得分(中码次数)
	 * @return
	 */
	public int getTheCode() {
		return theCode;
	}

	/**
	 * 当局码牌得分(中码次数)
	 * @param theCode
	 */
	public void setTheCode(int theCode) {
		this.theCode = theCode;
	}
	
	/**
	 * 当局码牌
	 * @return
	 */
	public List<Integer> getMaPai() {
		return maPai;
	}

	/**
	 * 当局码牌
	 * @param maPai
	 */
	public void setMaPai(List<Integer> maPai) {
		this.maPai = maPai;
	}
	
	/**
	 * 是否在抢杠状态
	 * @return
	 */
	public boolean isGrabBar() {
		return grabBar;
	}

	/**
	 * 是否在抢杠状态
	 * @param grabBar
	 */
	public void setGrabBar(boolean grabBar) {
		this.grabBar = grabBar;
	}

	/***
	 * 添加打牌战绩数据
	 * @param value
	 */
	public void addOperPlayback(String value) {
		getPlaybackDetail().getPlayDetail().add(value);
	}
	
	/**
	 * 战绩回放数据
	 * @return
	 */
	public MJPlaybackDetail getPlaybackDetail() {
		return playbackDetail;
	}

	/**
	 * 战绩回放数据
	 * @param playbackDetail
	 */
	public void setPlaybackDetail(MJPlaybackDetail playbackDetail) {
		this.playbackDetail = playbackDetail;
	}
	
	
	
}
